1 Bringing in and Modifying the dataset

To work with the Countries dataset, we will be bringing in Country Info from my github. We will also be limiting it to 2015 for our plot of life expectancy and income in 2015.

POC<-read.csv(file="https://dannyoc99.github.io/DOCAL/dataset/POC.csv")
POC500<-sample_n(POC,500)
pocprev<-POC500[7:9]

2 A look into the dataset

DT::datatable(pocprev, fillContainer = FALSE, options = list(pageLength = 11))

3 The 500 Gas Stations Chosen

g <- list(      scope = 'usa',
           projection = list(type = 'albers usa'),
             showland = TRUE,
            landcolor = toRGB("gray95"),
         subunitcolor = toRGB("gray85"),
         countrycolor = toRGB("gray85"),
         countrywidth = 0.5,
         subunitwidth = 0.5
       )
###
fig <- plot_geo(POC500, lat = ~ycoord, lon = ~xcoord) %>% 
  add_markers( text = ~paste(STATE, "<br>",
                           "County:", county, "<br>",
                           "Address", ADDRESS, "<br>",
                           "City:", CITY, "<br>",
                           "Zip:", ZIPnew),
              color = ~truckstop_flag, 
              symbol = "circle", 
              hoverinfo = "text")   %>% 
  layout( title = '500 Gas Stations in the United States', 
          geo = g,
          legend = list(title = list(text = "<b>Truckstop Y/N</b>"))) 

fig

Within our data, we wanted to take a look at 500 random gas stations within the united States. Within our sample, a large majority of our sample was on the east coast, west coast, and Texas. This makes a lot of sense, because when you consider the population densities of the United States, these would have the highest densities, and thus would require more gas stations. To have the graph give more information, I included whether or not a gas station is also a truck stop as a color. Looking at this information, we see that many of the midwest gas stations are truck stops, but most of the coastal states are just gas stations. This also makes sense as many of the mid western states do not have a ton of people living in them, so they are primarily used for travel requiring the gas stations to be truck stops.

4 Preparing Crime Statistics Data

crime_raw<-POC<-read.csv(file="https://dannyoc99.github.io/DOCAL/dataset/PhillyCrimeSince2015.csv")
crime2023<-mutate(crime_raw,year=format(as.Date(date,format="%m/%d/%Y"),"%Y"))%>%filter(year==2023)

5 Mapping Philidelphia 2015 Crimes

g <- list(      scope = 'usa',
           projection = list(type = 'albers usa'),
             showland = TRUE,
            landcolor = toRGB("gray95"),
         subunitcolor = toRGB("gray85"),
         countrycolor = toRGB("gray85"),
         countrywidth = 0.5,
         subunitwidth = 0.5,
         scale=.3,
         center_lat=-75,
         center_long=40
       )

fig <- plot_geo(crime2023, lat = ~lat, lon = ~lng) %>% 
  add_markers( text = ~paste("Fatal:",fatal, "<br>",
                            "Street:",street_name, "<br>",
                           "Zip:", zip_code, "<br>",
                           "Neighborhood", neighborhood, "<br>",
                           "Sex:", sex, "<br>",
                           "Race:", race),
              color = ~fatal, 
              symbol = "circle", 
              hoverinfo = "text")   %>% 
  layout( title = '2023 Philidelphia Area Crimes', 
          geo = g,
          legend = list(title = list(text = "<b>Fatality Y/N</b>")),
          xaxis = list(range = list(-77, -74)),
yaxis = list(range = list(44, 46))) 

fig
LS0tDQp0aXRsZTogIkhvbWV3b3JrIDc6IE1hcHBpbmcgNTAwIEdhcyBTdGF0aW9ucyAgYW5kIFBoaWxpZGVscGhpYSBBcmVhIENyaW1lcyB0byBEZW1vbnN0cmF0ZSBLbm93bGVkZ2Ugb2YgUGxvdHRpbmcgb24gYSBNYXAiDQphdXRob3I6ICJEYW5pZWwgT0NhbGxhZ2hhbiINCmRhdGU6ICIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIFRhYmxlIG9mIGNvbnRlbnQgLSBuYXZpZ2F0aW9uICovDQpkaXYjVE9DIGxpIHsNCiAgICBsaXN0LXN0eWxlOm5vbmU7DQogICAgYmFja2dyb3VuZC1jb2xvcjpibGFjazsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQogICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogICAgY29sb3I6IGxpZ2h0Ymx1ZTsNCn0NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBOYXZ5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IGJsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogYmx1ZTsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBOYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IE5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogTmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KPC9zdHlsZT4NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikgICAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZXQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmxldCIpDQp9DQppZiAoIXJlcXVpcmUoIm1hcHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIm1hcHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFwcyIpDQp9DQppZiAoIXJlcXVpcmUoImh0bWx0b29scyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiaHRtbHRvb2xzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx0b29scyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZWdlbmQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZWdlbmQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmxlZ2VuZCIpDQp9DQppZiAoIXJlcXVpcmUoImdlb2pzb25pbyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2VvanNvbmlvIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdlb2pzb25pbyIpDQp9DQppZiAoIXJlcXVpcmUoInN0cmluZ2kiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInN0cmluZ2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgic3RyaW5naSIpDQp9DQppZiAoIXJlcXVpcmUoIlJDb2xvckJyZXdlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIlJDb2xvckJyZXdlciIpDQp9DQppZiAoIXJlcXVpcmUoInRpZ3JpcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidGlncmlzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRpZ3JpcyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZwb3AiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZwb3AiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZnBvcCIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZlbSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmVtIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImxlYWZlbSIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXAiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRtYXAiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcCIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXB0b29scyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcHRvb2xzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRtYXB0b29scyIpDQp9DQppZiAoIXJlcXVpcmUoInJlYWR4bCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInJlYWR4bCIpDQp9DQojIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gIkM6L1VzZXJzLzc1Q1BFTkcvT25lRHJpdmUgLSBXZXN0IENoZXN0ZXIgVW5pdmVyc2l0eSBvZiBQQS9Eb2N1bWVudHMiKQ0KIyBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICJDOlxcU1RBNDkwXFx3MDUiDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEpDQpgYGANCg0KDQoNCiMgQnJpbmdpbmcgaW4gYW5kIE1vZGlmeWluZyB0aGUgZGF0YXNldA0KDQpUbyB3b3JrIHdpdGggdGhlIENvdW50cmllcyBkYXRhc2V0LCB3ZSB3aWxsIGJlIGJyaW5naW5nIGluIENvdW50cnkgSW5mbyBmcm9tIG15IGdpdGh1Yi4gV2Ugd2lsbCBhbHNvIGJlIGxpbWl0aW5nIGl0IHRvIDIwMTUgZm9yIG91ciBwbG90IG9mIGxpZmUgZXhwZWN0YW5jeSBhbmQgaW5jb21lIGluIDIwMTUuIA0KYGBge3IgZGF0YXNldH0NClBPQzwtcmVhZC5jc3YoZmlsZT0iaHR0cHM6Ly9kYW5ueW9jOTkuZ2l0aHViLmlvL0RPQ0FML2RhdGFzZXQvUE9DLmNzdiIpDQpQT0M1MDA8LXNhbXBsZV9uKFBPQyw1MDApDQpwb2NwcmV2PC1QT0M1MDBbNzo5XQ0KYGBgDQoNCiMgQSBsb29rIGludG8gdGhlIGRhdGFzZXQNCg0KYGBge3IgZGF0YX0NCkRUOjpkYXRhdGFibGUocG9jcHJldiwgZmlsbENvbnRhaW5lciA9IEZBTFNFLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTEpKQ0KYGBgDQoNCg0KDQojIFRoZSA1MDAgR2FzIFN0YXRpb25zIENob3Nlbg0KDQpgYGB7ciBwbG90fQ0KZyA8LSBsaXN0KCAgICAgIHNjb3BlID0gJ3VzYScsDQogICAgICAgICAgIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnYWxiZXJzIHVzYScpLA0KICAgICAgICAgICAgIHNob3dsYW5kID0gVFJVRSwNCiAgICAgICAgICAgIGxhbmRjb2xvciA9IHRvUkdCKCJncmF5OTUiKSwNCiAgICAgICAgIHN1YnVuaXRjb2xvciA9IHRvUkdCKCJncmF5ODUiKSwNCiAgICAgICAgIGNvdW50cnljb2xvciA9IHRvUkdCKCJncmF5ODUiKSwNCiAgICAgICAgIGNvdW50cnl3aWR0aCA9IDAuNSwNCiAgICAgICAgIHN1YnVuaXR3aWR0aCA9IDAuNQ0KICAgICAgICkNCiMjIw0KZmlnIDwtIHBsb3RfZ2VvKFBPQzUwMCwgbGF0ID0gfnljb29yZCwgbG9uID0gfnhjb29yZCkgJT4lIA0KICBhZGRfbWFya2VycyggdGV4dCA9IH5wYXN0ZShTVEFURSwgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdW50eToiLCBjb3VudHksICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZGRyZXNzIiwgQUREUkVTUywgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNpdHk6IiwgQ0lUWSwgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlppcDoiLCBaSVBuZXcpLA0KICAgICAgICAgICAgICBjb2xvciA9IH50cnVja3N0b3BfZmxhZywgDQogICAgICAgICAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLCANCiAgICAgICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiKSAgICU+JSANCiAgbGF5b3V0KCB0aXRsZSA9ICc1MDAgR2FzIFN0YXRpb25zIGluIHRoZSBVbml0ZWQgU3RhdGVzJywgDQogICAgICAgICAgZ2VvID0gZywNCiAgICAgICAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIjxiPlRydWNrc3RvcCBZL048L2I+IikpKSANCg0KZmlnDQpgYGANCg0KV2l0aGluIG91ciBkYXRhLCB3ZSB3YW50ZWQgdG8gdGFrZSBhIGxvb2sgYXQgNTAwIHJhbmRvbSBnYXMgc3RhdGlvbnMgd2l0aGluIHRoZSB1bml0ZWQgU3RhdGVzLiBXaXRoaW4gb3VyIHNhbXBsZSwgYSBsYXJnZSBtYWpvcml0eSBvZiBvdXIgc2FtcGxlIHdhcyBvbiB0aGUgZWFzdCBjb2FzdCwgd2VzdCBjb2FzdCwgYW5kIFRleGFzLiBUaGlzIG1ha2VzIGEgbG90IG9mIHNlbnNlLCBiZWNhdXNlIHdoZW4geW91IGNvbnNpZGVyIHRoZSBwb3B1bGF0aW9uIGRlbnNpdGllcyBvZiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlc2Ugd291bGQgaGF2ZSB0aGUgaGlnaGVzdCBkZW5zaXRpZXMsIGFuZCB0aHVzIHdvdWxkIHJlcXVpcmUgbW9yZSBnYXMgc3RhdGlvbnMuIFRvIGhhdmUgdGhlIGdyYXBoIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiwgSSBpbmNsdWRlZCB3aGV0aGVyIG9yIG5vdCBhIGdhcyBzdGF0aW9uIGlzIGFsc28gYSB0cnVjayBzdG9wIGFzIGEgY29sb3IuIExvb2tpbmcgYXQgdGhpcyBpbmZvcm1hdGlvbiwgd2Ugc2VlIHRoYXQgbWFueSBvZiB0aGUgbWlkd2VzdCBnYXMgc3RhdGlvbnMgYXJlIHRydWNrIHN0b3BzLCBidXQgbW9zdCBvZiB0aGUgY29hc3RhbCBzdGF0ZXMgYXJlIGp1c3QgZ2FzIHN0YXRpb25zLiBUaGlzIGFsc28gbWFrZXMgc2Vuc2UgYXMgbWFueSBvZiB0aGUgbWlkIHdlc3Rlcm4gc3RhdGVzIGRvIG5vdCBoYXZlIGEgdG9uIG9mIHBlb3BsZSBsaXZpbmcgaW4gdGhlbSwgc28gdGhleSBhcmUgcHJpbWFyaWx5IHVzZWQgZm9yIHRyYXZlbCByZXF1aXJpbmcgdGhlIGdhcyBzdGF0aW9ucyB0byBiZSB0cnVjayBzdG9wcy4NCg0KDQojIFByZXBhcmluZyBDcmltZSBTdGF0aXN0aWNzIERhdGENCg0KYGBge3IgY3JpbWV9DQpjcmltZV9yYXc8LVBPQzwtcmVhZC5jc3YoZmlsZT0iaHR0cHM6Ly9kYW5ueW9jOTkuZ2l0aHViLmlvL0RPQ0FML2RhdGFzZXQvUGhpbGx5Q3JpbWVTaW5jZTIwMTUuY3N2IikNCmNyaW1lMjAyMzwtbXV0YXRlKGNyaW1lX3Jhdyx5ZWFyPWZvcm1hdChhcy5EYXRlKGRhdGUsZm9ybWF0PSIlbS8lZC8lWSIpLCIlWSIpKSU+JWZpbHRlcih5ZWFyPT0yMDIzKQ0KYGBgDQoNCiMgTWFwcGluZyBQaGlsaWRlbHBoaWEgMjAxNSBDcmltZXMNCg0KYGBge3IgZ3JhcGhpbmcgcGhpbGx5fQ0KZyA8LSBsaXN0KCAgICAgIHNjb3BlID0gJ3VzYScsDQogICAgICAgICAgIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnYWxiZXJzIHVzYScpLA0KICAgICAgICAgICAgIHNob3dsYW5kID0gVFJVRSwNCiAgICAgICAgICAgIGxhbmRjb2xvciA9IHRvUkdCKCJncmF5OTUiKSwNCiAgICAgICAgIHN1YnVuaXRjb2xvciA9IHRvUkdCKCJncmF5ODUiKSwNCiAgICAgICAgIGNvdW50cnljb2xvciA9IHRvUkdCKCJncmF5ODUiKSwNCiAgICAgICAgIGNvdW50cnl3aWR0aCA9IDAuNSwNCiAgICAgICAgIHN1YnVuaXR3aWR0aCA9IDAuNSwNCiAgICAgICAgIHNjYWxlPS4zLA0KICAgICAgICAgY2VudGVyX2xhdD0tNzUsDQogICAgICAgICBjZW50ZXJfbG9uZz00MA0KICAgICAgICkNCg0KZmlnIDwtIHBsb3RfZ2VvKGNyaW1lMjAyMywgbGF0ID0gfmxhdCwgbG9uID0gfmxuZykgJT4lIA0KICBhZGRfbWFya2VycyggdGV4dCA9IH5wYXN0ZSgiRmF0YWw6IixmYXRhbCwgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJlZXQ6IixzdHJlZXRfbmFtZSwgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlppcDoiLCB6aXBfY29kZSwgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5laWdoYm9yaG9vZCIsIG5laWdoYm9yaG9vZCwgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNleDoiLCBzZXgsICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYWNlOiIsIHJhY2UpLA0KICAgICAgICAgICAgICBjb2xvciA9IH5mYXRhbCwgDQogICAgICAgICAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLCANCiAgICAgICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiKSAgICU+JSANCiAgbGF5b3V0KCB0aXRsZSA9ICcyMDIzIFBoaWxpZGVscGhpYSBBcmVhIENyaW1lcycsIA0KICAgICAgICAgIGdlbyA9IGcsDQogICAgICAgICAgbGVnZW5kID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICI8Yj5GYXRhbGl0eSBZL048L2I+IikpLA0KICAgICAgICAgIHhheGlzID0gbGlzdChyYW5nZSA9IGxpc3QoLTc3LCAtNzQpKSwNCnlheGlzID0gbGlzdChyYW5nZSA9IGxpc3QoNDQsIDQ2KSkpIA0KDQpmaWcNCg0KYGBg